package top.drose;

import com.alibaba.fastjson2.JSON;
import top.drose.entity.QuestionSheet;
import top.drose.utils.ColorOut;

import java.io.*;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.*;
import java.util.stream.IntStream;

public class TUI {
    String preDir="C:\\Users\\Public\\Documents\\AutoJudge";
    static Scanner sc = new Scanner(System.in);
    public TUI(){
        File f=new File(preDir);
        if(!f.exists()){
            f.mkdirs();
        }
    }
    void loop(){
        while(true){
            clearConsole();
            System.out.println("1. 录入数据");
            System.out.println("2. 开始答题");
            System.out.println("3. 历史记录");
            System.out.println("4. 删除试卷");
            System.out.println("0. 退出系统");

            int i=getOneInteger();

            clearConsole();
            if(i==0){
                System.exit(0);
            }
            else if(i==1){//录入数据
                QuestionSheet qs=new QuestionSheet(UUID.randomUUID().toString());
                //设置试卷基本信息
                System.out.println("输入试卷名称：");
                qs.setName(sc.nextLine());
                System.out.printf("单选题个数：");
                qs.setSingleNumber(getOneInteger());
                System.out.printf("多选题个数：");
                qs.setMultipleNumber(getOneInteger());

                int index=1;

                for(int j=0;j<qs.getSingleNumber();j++){//读入单选题
                    clearConsole();
                    System.out.println("单选题答案录入：");
                    System.out.printf("题目%d：",index++);
                    String line=sc.nextLine();
                    while("".equals(line)){
                        System.out.printf("题目%d：",j);
                        line=sc.nextLine();
                    }
                    qs.getSingleCorrectAnswers().add(line.charAt(0));
                }
                for(int j=0;j<qs.getMultipleNumber();j++){//读入多选题
                    clearConsole();
                    System.out.println("多选题答案录入：");
                    System.out.printf("题目%d：",index);
                    String line=sc.nextLine();
                    while("".equals(line)){
                        System.out.printf("题目%d：",index);
                        line=sc.nextLine();
                    }
                    index++;
                    qs.getMultiCorrectAnswers().add(line);
                }
                System.out.println("录入完毕...");
                String jsonString = JSON.toJSONString(qs);
                String f= preDir+"\\"+ qs.getId() + ".json";
                try {
                    //指定utf-8写入数据
                    Files.write(Paths.get(f), Collections.singletonList(jsonString), StandardCharsets.UTF_8);
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }


            }
            else if(i==2){
                //读入所有试卷
                LinkedList<QuestionSheet> qsList=new LinkedList<>();
                File dir=new File(preDir);
                String[] files = dir.list();//返回的是文件名
                for(int j=0;j<files.length;j++){
                    try {
                        String content = Files.readString(Paths.get(preDir,files[j]));
                        QuestionSheet temp=JSON.parseObject(content,QuestionSheet.class);
                        qsList.add(temp);
                    } catch (FileNotFoundException e) {
                        throw new RuntimeException(e);
                    } catch (IOException e) {
                        throw new RuntimeException(e);
                    }
                }
                for(int j=0;j<qsList.size();j++){
                    System.out.println((j+1)+"    " +qsList.get(j).getName());
                }

                System.out.println("选择指定试卷：");
                System.out.println("0返回");
                int qsNum = getOneInteger();
                if(qsNum==0){//如果返回，则放回上层循环
                    clearConsole();
                    continue;
                }

                //否则进入答题循环
                QuestionSheet currentQS=qsList.get(qsNum-1);
                if(currentQS.getHistory()){//如果是历史记录，直接输出结果
                    currentQS.showResult(Optional.of(true));
                    System.out.printf("回车继续...");
                    sc.nextLine();
                }else{//不是历史记录的才要答题
                    questionSheetAnswerLoop(currentQS);
                }
            }
            else if(i==3){//查看历史记录

            }
            else if(i==4){
                while(true){
                    ColorOut.printlnRed("正在删除文件，请谨慎操作！");
                    //在删除成功后，需要重新读入所有试卷
                    LinkedList<QuestionSheet> qsList=new LinkedList<>();
                    File dir=new File(preDir);
                    String[] files = dir.list();//返回的是文件名
                    //qsList和files中的文件名是一一对应的
                    for(int j=0;j<files.length;j++){
                        try {
                            String content = Files.readString(Paths.get(preDir,files[j]));
                            QuestionSheet temp=JSON.parseObject(content,QuestionSheet.class);
                            qsList.add(temp);
                        } catch (FileNotFoundException e) {
                            throw new RuntimeException(e);
                        } catch (IOException e) {
                            throw new RuntimeException(e);
                        }
                    }
                    for(int j=0;j<qsList.size();j++){
                        System.out.println((j+1)+"    " +qsList.get(j).getName());
                    }

                    System.out.println("选择指定试卷：");
                    System.out.println("0返回");
                    int qsNum = getOneInteger();
                    if(qsNum==0){//如果返回，则放回上层循环
                        clearConsole();
                        break;
                    }else{
                        File f=new File(Paths.get(preDir,files[qsNum-1]).toUri());
                        boolean delete = f.delete();
                        if(delete){
                            System.out.println("删除成功,回车继续...");
                            sc.nextLine();
                        }
                    }
                }

            }
        }
    }

    void questionSheetAnswerLoop(QuestionSheet currentQS){
        //这里不影响录入成绩，所以只是在答题前，先把qs中的responseList
        //初始化到指定长度
        for(int i=0;i<currentQS.getSingleNumber();i++){
            currentQS.getSingleResponse().add('-');
        }
        for(int i=0;i<currentQS.getMultipleNumber();i++){
            currentQS.getMultiResponse().add("-");
        }

        int index=1;//当前题目

        //现在是顺序答题，如果希望跳转如何做？
        //如果允许跳转，则list不能用add方法了,而且所有的数据都要初始化
        while(true){
            //给出当前index题目的提示：
            //题目下标从0到singleNum+multiNum-1;
            clearConsole();
            currentQS.show();
            if((index-1)< currentQS.getSingleNumber()){
                System.out.printf("单选题-题目%d：",index);
            }
            else if((index-1)>=currentQS.getSingleNumber()
                    &&
                    (index-1)<currentQS.getSingleNumber()+currentQS.getMultipleNumber()){
                System.out.printf("多选题-题目%d：",index);
            }else{
                if(!isRemaining(currentQS)){
                    break;//如果全部答完
                }else{
                    //如果还有剩余题目
                    System.out.printf("还有剩余题目，请选择题号：");
                }
            }

            //读入数据
            String input=sc.nextLine();
            if("q".equals(input)){
                break;//退出循环
            }
            else if("s".equals(input)){
                //执行保存操作
                currentQS.save(preDir);
                sc.nextLine();
                return;//这里直接返回到上一级页面
            }
            //结束答题开始计算成绩
            else if("o".equals(input)){
                System.out.println("开始计算成绩...");
                break;
            }
            else if(str2Num(input)!=-1){
                index=str2Num(input);//获取跳转题号
                //判断调整题号的范围在合适范围
                //最小题号为1，最大题号为单选题+多选题-1
                //如果超出，则index重置为边界
                if(index<1){
                    index=1;
                }else if(index > currentQS.getSingleNumber()+ currentQS.getMultipleNumber()){
                    index=currentQS.getSingleScore()+currentQS.getMultipleNumber();
                }
                //重置index后到下一次循环
                continue;
            }
            else{//剩下就是读入index所在位置的题目了
                if((index-1)< currentQS.getSingleNumber()){
                    currentQS.getSingleResponse().set(index-1,input.charAt(0));
                }
                else if((index-1)>=currentQS.getSingleNumber()
                        &&
                        (index-1)<currentQS.getSingleNumber()+currentQS.getMultipleNumber()){
                    currentQS.getMultiResponse()
                            .set(index-1-currentQS.getSingleNumber(),
                                    input);
                }else{
                    System.out.printf("题目编号异常...");
                }
                index++;//读入题目后才可以对题号++
            }



        }
//        for(int j=0;j<currentQS.getSingleNumber();j++){
//            clearConsole();
//            currentQS.show();
//            System.out.printf("单选题-题目%d：",index++);
//            String line=sc.nextLine();
//            currentQS.getSingleResponse().add(line.charAt(0));
//        }
//        for(int j=0;j<currentQS.getMultipleNumber();j++){
//            clearConsole();
//            currentQS.show();
//            System.out.printf("多选题-题目%d：",index++);
//            String line=sc.nextLine();
//            currentQS.getMultiResponse().add(line);
//        }
        clearConsole();
        //要先计算，才给能出结果
        currentQS.showResult();
        currentQS.save(preDir);
        System.out.printf("输入回车返回...");
        sc.nextLine();
    }

    private boolean isRemaining(QuestionSheet currentQS) {
        boolean res = IntStream.range(0,currentQS.getSingleNumber())
                .mapToObj(i->currentQS.getSingleResponse().get(i))
                .anyMatch(c->c=='-');
        //有'-'则返回真
        boolean res1= IntStream.range(0,currentQS.getMultipleNumber())
                .mapToObj(i->currentQS.getMultiResponse().get(i))
                .anyMatch(c->"-".equals(c));
        //二者有一个存在'-'就说明没有答完
        return res||res1;
    }

    /**
     * 读入int，如果失败，则一直读入
     * @return  如果为
     */
    public Integer getOneInteger(){
        int res=Integer.MIN_VALUE;
        boolean flag=false;
        do{
            try {
                res= Integer.parseInt(sc.nextLine());
                flag=true;//如果读取成功，则flag为true，从而退出循环
            }catch (NumberFormatException e){
                System.out.println("请输入一个有效数字:1,2,0");
                flag=false;
            }
        }while(flag==false);
        return res;
    }

    /**
     * 如果成功，则返回正确结果，否则返回-1
     * @param input
     * @return
     */
    public Integer str2Num(String input){
        try {
            return Integer.parseInt(input);
        }catch (NumberFormatException e){
            return -1;
        }
    }
    /**
     * 清空控制台
     */
    public static void clearConsole() {
        try {
            String os = System.getProperty("os.name").toLowerCase();

            if (os.contains("win")) {
                // Windows 系统
                new ProcessBuilder("cmd", "/c", "cls").inheritIO().start().waitFor();
            } else {
                // Linux 或 macOS 系统
                System.out.print("\033[H\033[2J");
                System.out.flush();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}
